package com.xxxx.servlet;

import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class DownloadServlet extends HttpServlet {

    public static void main(String[] args) throws IOException {
        //需要编码的内容
        String content = "我爱你";
        //创建Base64编码器
        BASE64Encoder base64Encoder = new BASE64Encoder();
        //执行编码
        String encode = base64Encoder.encode(content.getBytes(StandardCharsets.UTF_8));
        System.out.println(encode);
        //创建Base64解码器
        BASE64Decoder base64Decoder = new BASE64Decoder();
        //执行解码
        byte[] bytes = base64Decoder.decodeBuffer(encode);
        System.out.println(new String(bytes, "UTF-8"));
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        文件下载
//        1.获取要下载的文件名
        String downloadFilename = "新建文本文档.txt";
//        2.读取要下载的文件内容(通过servletContext对象可以读取)
        ServletContext servletContext = getServletContext();
        //获取要下载的文件类型
        String mimeType = servletContext.getMimeType("/file/" + downloadFilename);
        System.out.println("下载的文件类型：" + mimeType);
        //        4.在回传前，通过响应头告诉客户端返回的数据类型
        response.setContentType(mimeType);
//        5．还要告诉客户端收到的数据是用于下载使用（还是使用响应头）
        //attachment表示附件，表示下载使用.URLEncoder.encode解决中文文件名乱码，将汉字转换为xx%xx的格式
        if (request.getHeader("User-Agent").contains("Firefox")) {
            //如果是火狐用Base64编码
            response.setHeader("Content-Disposition", "attachment;filename==?UTF-8?B?" + new BASE64Encoder().encode(downloadFilename.getBytes(StandardCharsets.UTF_8)) + "?=");
        } else {
            //其他用url编码
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFilename, "UTF-8"));
        }
        //斜杠被服务器解析为地址http://ip:port/工程名 映射 到webapp目录
        InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFilename);
//        获取响应输出流
        OutputStream outputStream = response.getOutputStream();
        //        3.把下载的文件内容回传给客户端
//        读取输入流中的数据，复制给输出流，输出给客户端
        IOUtils.copy(resourceAsStream, outputStream);
    }
}
